#ifndef __DEFS_H__
#define __DEFS_H__

#include "types.h"
#include "riscv.h"
#include "spinlock.h"

// main.c
void main();

// printf.c
void printfinit(void);
void printf(char*, ...);
void panic(char*) __attribute__((noreturn));

// console.c
void consoleinit(void);

// kalloc.c
void kinit();
void* kalloc(void);
void kfree(void*);

// vm.c
void kvminit(void);
void kvminithart(void);
int mappages(pagetable_t, uint64, uint64, uint64, int);

// string.c
void* memset(void *dst, int c, uint n);

// spinlock.c
void acquire(struct spinlock*);
void release(struct spinlock*);
void initlock(struct spinlock*, char*);

// uart.c
void uartinit(void);
void uart_putc(char);
int  uart_getc(void);  // 添加这行

// ---------- Interrupt framework ----------
typedef void (*interrupt_handler_t)(void);

// 初始化（全局/每核）
void trapinit(void);
void trapinithart(void);

// 注册/注销/使能/屏蔽 指定 IRQ（仅限S态三类：1=SSIP, 5=STIP, 9=SEIP）
void register_interrupt(int irq, interrupt_handler_t h);
void unregister_interrupt(int irq);
void enable_interrupt(int irq);
void disable_interrupt(int irq);

// 计时器相关（S态可用）
uint64 get_time(void);        // 读取芯片时钟（CLINT mtime）
void   timer_interrupt(void); // 默认时钟处理中断回调（可覆盖）

// 调度钩子（弱符号，默认空实现）
void scheduler_tick(void);

// ticks 计数与自旋锁
extern struct spinlock tickslock;
extern volatile uint64 ticks;

// 设备/陷阱通用
void kerneltrap(void);
int  devintr(void);

// exception
struct trapframe; // 前向声明
void handle_exception(struct trapframe *tf);

// tests
void test_timer_interrupt(void);
void test_exception_handling(void);
void test_interrupt_overhead(void);

// 进程与调度
struct proc;
struct context;
struct cpu;


void            procinit(void);
struct proc*    alloc_process(void);
void            free_process(struct proc *p);
int             create_process(void (*entry)(void));
void            exit_process(int status) __attribute__((noreturn));
int             wait_process(int *status);

void            scheduler(void) __attribute__((noreturn));
void            sched(void);
void            yield(void);

void            sleep(void *chan, struct spinlock *lk);
void            wakeup(void *chan);

// CPU/Proc helpers
int             cpuid(void);
struct cpu*     mycpu(void);
struct proc*    myproc(void);

// 进程测试入口
void proc_tests_start(void);

// 系统调用相关
void syscall_dispatch(void);
int argint(int n, int *ip);
int argaddr(int n, uint64 *ip);
int argstr(int n, char *buf, int max);

// 系统调用测试入口
void syscall_tests_start(void);

// 文件系统相关（实验7）
// 前向声明（在包含头文件之前）
struct sleeplock;
struct inode;
struct file;
struct buf;
struct superblock;
struct logheader;
struct stat;

// 包含文件系统头文件以获取完整类型定义
#include "fs/sleeplock.h"
#include "fs/stat.h"
#include "fs/fs.h"

// 睡眠锁
void initsleeplock(struct sleeplock *lk, char *name);
void acquiresleep(struct sleeplock *lk);
void releasesleep(struct sleeplock *lk);
int holdingsleep(struct sleeplock *lk);

// 块缓存
void binit(void);
struct buf* bread(uint dev, uint blockno);
void bwrite(struct buf *b);
void brelse(struct buf *b);
void bpin(struct buf *b);
void bunpin(struct buf *b);

// 磁盘驱动
int virtio_disk_init(void);
void virtio_disk_rw(struct buf *b, int write);
void ramdisk_init(void);
void ramdisk_rw(struct buf *b, int write);
void set_use_ramdisk(int use);

// 日志系统
void initlog(int dev, struct superblock *sb);
void begin_op(void);
void end_op(void);
void log_write(struct buf *b);

// 文件系统核心
void fsinit(int dev);
void iinit(int dev);
struct inode* ialloc(uint dev, short type);
struct inode* idup(struct inode *ip);
void ilock(struct inode *ip);
void iunlock(struct inode *ip);
void iupdate(struct inode *ip);
void iput(struct inode *ip);
void iunlockput(struct inode *ip);
void itrunc(struct inode *ip);
int readi(struct inode *ip, int user_dst, uint64 dst, uint off, uint n);
int writei(struct inode *ip, int user_src, uint64 src, uint off, uint n);
struct inode* namei(char *path);
struct inode* nameiparent(char *path, char *name);
struct inode* dirlookup(struct inode *dp, char *name, uint *poff);
int dirlink(struct inode *dp, char *name, uint inum);
struct inode* create(char *path, short type, short major, short minor);

// 文件描述符管理
void fileinit(void);
struct file* filealloc(void);
struct file* filedup(struct file *f);
void fileclose(struct file *f);
int filestat(struct file *f, struct stat *st);
int fileread(struct file *f, uint64 addr, int n);
int filewrite(struct file *f, uint64 addr, int n);
void stati(struct inode *ip, struct stat *st);
void devinit(void);

// 用户空间/内核空间数据复制
int either_copyout(int user_dst, uint64 dst, void *src, uint64 len);
int either_copyin(void *dst, int user_src, uint64 src, uint64 len);

// 文件系统测试
void fs_tests_start(void);

#endif // __DEFS_H__